package com.scott.crm.base.service;

import com.scott.crm.base.dto.RedisDTO;
import com.scott.crm.base.constant.TtlConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.Map;

/**
 * @author 黄后林
 * @version 1.0
 * @note
 * @date 2021-12-04 21:33:32
 */
@Component
@Slf4j
public class TokenService {

    /**
     * 方法描述: 验证token不为空且token在有效期内 true代表用户已登陆且在有效期内的  false代表用户未登录或者已登录但过了有效期
     * @author: 黄后林
     * @date: 2021/12/4 21:35
     * @param token
     * @return boolean
     */
    public boolean checkTokenAndTtl(String token) {

        if(StringUtils.isEmpty(token)){
            //说明没有带token=未登陆用户
            return false;
        }

        // 模拟连接到到redis 拿到以前放在redis中的数据
        Map<String, RedisDTO> redis = ScottRedisService.REDIS;
        return checkTtl(redis,token);
    }

    private boolean checkTtl(Map<String, RedisDTO> redis, String token){
        RedisDTO dto = redis.get(token);

        if(dto==null){
            //说明redis中没有这个token 说明用户未登录或者有登陆但是token失效
            return false;
        }

        //上次登录时间
        Date lastUpdateTime = dto.getLastUpdateTime();

        //现在的时间
        Date now = new Date();

        //剩余时间
        Long pass = (now.getTime()-lastUpdateTime.getTime())/1000;

        if(pass< TtlConstant.ttl){
            //说明token还在有效期间内 重置ttl时间并放行
            dto.setLastUpdateTime(now);
            dto.setTtl(TtlConstant.ttl-pass);
            redis.put(token,dto);
            System.out.println(redis);
            return true;
        }
        log.info("---------token已过期---------");
        return false;
    }
}
